易语言添加请求头

易语言添加请求头,第1张

易语言添加请求头,解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头、正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现。

1.第一步 服务端设置响应头

header(‘Access-Control-Allow-Origin:*’)//支持全域名访问,不安全,部署后需要固定限制为客户Duan网址

header(‘Access-Control-Allow-Methods:POST,GET,OPTIONS,DELETE’)//支持的http 动作

header(‘Access-Control-Allow-Headers:x-requested-with,content-type’)//响应头 请按照自己需求添加。

2.第二部 了解IE chrome 等浏览器 对于 跨域请求并要求设置Headers自定义参数的时候的 “预请求” 就是如果遇到 跨域并设置headers的请求,所有请求需要两步完成!

A 第一步:发送预请求 OPTIONS 请求。此时 服务器端需要对于OPTIONS请求作出响应 一般使用202响应即可 不用返回任何内容信息。(能看到这份手稿的人,本人不相信你后台处理不了一个options请求)

B 第二步:服务器accepted 第一步请求后 浏览器自动执行第二步 发送真正的请求。此时 大多数人 会发现请求成功了,但是 有那么几个人会发现 请求成功了但是没有任何信息返回 why?因为你自定义的请求头在服务器响应中不存在!

查看console输出 会发现一个问题:

“Access-Control-Allow-Headers 列表中不存在请求标头 XXXXXX”【IE】,

request header field xxxxxx is not allowed by Access-Control-Allow-Header【chrome】

这是因为 你的XXXX请求头 没有在服务器端被允许哦~

遇到这个问题 只有通过修改服务器端来完成。

首先需要在url中加特殊标记/协议, 如在onWebViewResource方法中拦截对应的请求,然后将要添加的请求头,以get形式拼接到url末尾。

拦截器没搞懂就先搞这个法子暂时先写到请求里面,不然api接口啥都用不了,其实也并不是特别麻烦,后续要改,不考虑使用拦截器的话,可能要使用到sqlite数据库,emmmm,想想还是别这么干。

1,post + header

 public void postTest(){

        OkHttpClient client = new OkHttpClient()

        //post请求

        FormBody formBody = new FormBody.Builder()

                .add("event_id","33")

                .build()

        Request request = new Request.Builder().url(DecryptionAddress+"app/event/accept").

                addHeader("Token","服务器获取的token").post(formBody).build()

        client.newCall(request).enqueue(new Callback() {

            public void onFailure(Call call, IOException e) {

                System.out.println(e.getMessage())

            }            public void onResponse(Call call, Response response) throws IOException {

                if(response.code() >= 200 &&response.code() <300) {

                   String result = response.body().string()

                    System.out.println(result)

                }

            }

        })

    }

登录后复制

2,get + header

4种为HttpClient添加默认请求头的方式。下面详细的介绍;

第一种方式

直接在创建的HttpClient对象的DefaultRequestHeaders集合中添加报头。

class Program

{undefined

static Task Main()=>SendAsync1()

private static async Task SendAsync1()

{undefined

var httpClient = new HttpClient()

AddDefaultHeaders(httpClient)

await httpClient.GetStringAsync("http://localhost:5000/")

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

httpClient.DefaultRequestHeaders.Add("x-www-foo", "123")

httpClient.DefaultRequestHeaders.Add("x-www-bar", "456")

httpClient.DefaultRequestHeaders.Add("x-www-baz", "789")

}

}

第二种方式

对于.NET Core应用来说,我们更推荐的做法是采用依赖注入的方式,利用IHttpClientFactory来创建HttpClient对象,那么我们在进行相关服务注册的时候就可以设置默认请求报头。

class Program

{undefined

static Task Main()=>SendAsync2()

private static async Task SendAsync2()

{undefined

var services = new ServiceCollection()

services.AddHttpClient("", AddDefaultHeaders)

var httpClient = services

.BuildServiceProvider()

.GetRequiredService()

.CreateClient()

await httpClient.GetStringAsync("http://localhost:5000/")

}

private static void AddDefaultHeaders(HttpClient httpClient)

{undefined

httpClient.DefaultRequestHeaders.Add("x-www-foo", "123")

httpClient.DefaultRequestHeaders.Add("x-www-bar", "456")

httpClient.DefaultRequestHeaders.Add("x-www-baz", "789")

}

}

第三种方式

由于HttpClient在发送请求的时候会利用DiagnosticSource对象发送相应的诊断事件,并且将作为请求的HttpRequestMessage对象作为请求事件内容负载。我们可以订阅该事件,在请求被发送之前将其拦截下来,并添加相应的请求头即可。

class Program

{undefined

static Task Main()=>SendAsync3()

private static async Task SendAsync3()

{undefined

Func requestAccessor = null

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.Subscribe(kv =>

{undefined

if (kv.Key == "System.Net.Http.HttpRequestOut.Start")

{undefined

requestAccessor ??= BuildRequestAccessor(kv.Value.GetType())

var request = requestAccessor(kv.Value)

AddDefaultHeaders(request)

}

})

}

})

var httpClient = new HttpClient()

await httpClient.GetStringAsync("http://localhost:5000/")

static Func BuildRequestAccessor(Type payloadType)

{undefined

var property = payloadType.GetProperty("Request", BindingFlags.Instance | BindingFlags.Public)

var payload = Expression.Parameter(typeof(object))

var convertedPayload = Expression.Convert(payload, payloadType)

var getRequest = Expression.Call(convertedPayload, property.GetMethod)

var convert = Expression.Convert(getRequest, typeof(HttpRequestMessage))

return Expression.Lambda>(convert, payload).Compile()

}

}

private static void AddDefaultHeaders(HttpRequestMessage request)

{undefined

request.Headers.Add("x-www-foo", "123")

request.Headers.Add("x-www-bar", "456")

request.Headers.Add("x-www-baz", "789")

}

}

第四种方式

上面这种方式可以采用强类型编程方式,具体的代码如下。

class Program

{undefined

static Task Main()=>SendAsync4()

private static async Task SendAsync4()

{undefined

DiagnosticListener.AllListeners.Subscribe(listener =>

{undefined

if (listener.Name == "HttpHandlerDiagnosticListener")

{undefined

listener.SubscribeWithAdapter(new HttpClientListener())

}

})

var httpClient = new HttpClient()

await httpClient.GetStringAsync("http://localhost:5000/")

}

private sealed class HttpClientListener

{undefined

[DiagnosticName("System.Net.Http.HttpRequestOut.Start")]

public void OnSend(HttpRequestMessage request) =>AddDefaultHeaders(request)

//Must subscribute the System.Net.Http.HttpRequestOut event.

[DiagnosticName("System.Net.Http.HttpRequestOut")]

public void OnSend() { }

}

private static void AddDefaultHeaders(HttpRequestMessage request)

{undefined

request.Headers.Add("x-www-foo", "123")

request.Headers.Add("x-www-bar", "456")

request.Headers.Add("x-www-baz", "789")

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11484332.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-16
下一篇2023-05-16

发表评论

登录后才能评论

评论列表(0条)

    保存