标签: httpclient

为什么将 RequestUri 作为参数传递与在 HttpRequestMessage 中设置它不同

我有一个 HttpClient (由 IHttpClientFactory 生成),其 BaseAddress 为“www.mydomain.com/3.0/”。我将使用不同的方法使用不同的路径来访问该客户端。所以我首先设置一个 HttpRequestMessage。我注意到这两个实现的行为不同。

这:

var message = new HttpRequestMessage(HttpMethod.Get, $"account-lookup/?query={email}")
{
    Headers =
        {
            { key, value }
        }
};
Run Code Online (Sandbox Code Playgroud)

作品。但是这个:

var message = new HttpRequestMessage()
{
    Method = HttpMethod.Get,
    Headers =
        {
            { key, value }
        },
    RequestUri = new Uri($"account-lookup/?query={email}")
};
Run Code Online (Sandbox Code Playgroud)

返回异常Invalid URI: The format of the URI could not be determined.

我们不能用这样的字符串创建一个新的 Uri,不是吗?为什么我们没有一个属性或方法来让我们传递路径字符串?我假设 HttpRequestMessage 的构造函数在内部将传递的属性附加或连接到 BaseAddress?

我可以/应该做类似的事情
RequestUri = new Uri(Client.BaseAddress + $"account-lookup/?query={email}")
,但是以某种方式附加路径字符串会很好。

c# httpclient httprequest

1
推荐指数
1
解决办法
465
查看次数

HttpClient GetStringAsync 结果不一致

我有一个非常简单的控制台应用程序,用户可以在其中输入 Twitch 用户的名称,以查看是否存在具有该名称的 Twitch 个人资料。这是代码:

while (true)
{
    string username = Console.ReadLine();

    HttpClient client = new HttpClient();
    string result = await client.GetStringAsync($"https://www.twitch.tv/{username}");

    Console.WriteLine("User exists: " + !result.Contains("Twitch is the world"));

    Console.ReadKey();
}
Run Code Online (Sandbox Code Playgroud)

仅当提供的网址未指向现有个人资料时,文本“Twitch is the world”才会存在于结果中。我遇到的问题是 HttpClient 似乎只在第一次返回“正确”的结果。例如,我启动程序并输入“xqc”。这会给我结果

User exists: True
Run Code Online (Sandbox Code Playgroud)

但是,如果我现在尝试再次输入“xqc”(或任何其他现有的配置文件名称),它总是会产生以下结果

User exists: False
Run Code Online (Sandbox Code Playgroud)

我检查了实际的字符串,它发生的原因是,由于某种原因,第一个请求之后发出的每个请求都会返回 Twitch 的个人资料未找到页面。我不明白为什么会发生这种情况。是否有我遗漏的东西,或者我应该在这里使用其他东西而不是 HttpClient?

c# httpclient web-scraping

1
推荐指数
1
解决办法
123
查看次数

HttpClient与锚点链接出错400错误

这是我的代码:

DefaultHttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet(url);
HttpResponse response = client.execute(request);
Run Code Online (Sandbox Code Playgroud)

这适用于我迄今为止尝试的每个网址,除了一些包含锚点的网址.这些锚定网址中的一些返回400.奇怪的是,并非所有包含锚点的链接,其中很多都可以正常工作.

不幸的是,我必须非常一般,因为我无法在这里提供具体的网址.

链接完全有效,并且在任何浏览器中都可以正常工作,但HttpClient在尝试链接时返回400.如果我删除锚,它将工作.

任何想法要找什么?

例如: http://www.somedomain.com/somedirectory/somepage#someanchor

对于仿制药再次抱歉

编辑:我应该提到这是为Android.

java anchor android httpclient

0
推荐指数
1
解决办法
1846
查看次数

将URI分解为其组成部分的正确术语是什么?

假设我们有一个字符串"http://www.example.com/feed".我将这个字符串分成三部分用于Apache的URI类:1."http"2."www.example.com"3."/ feed"

对于将URI分解为其组件的过程,是否有适当的术语?

url uri http httpclient

0
推荐指数
1
解决办法
119
查看次数

在Android中获得400 HTTP响应的响应正文?

我正在与一个我无法更改的API进行通信,当API请求未在API端验证时,该API会发送400响应.它是有效的HTTP请求,但请求数据未通过应用程序的验证规则.

400响应包含一个JSON有效负载,其中包含有关请求未通过验证的原因的信息.

我似乎无法获得响应体,因为抛出了HttpRequestException.有人知道如何检索这个响应体吗?

try {
        HttpUriRequest request = params[0];
        HttpResponse serverResponse = mClient.execute(request);

        BasicResponseHandler handler = new BasicResponseHandler();
        String response = handler.handleResponse(serverResponse);
        return response;
    } catch(HttpResponseException e) {
        // Threw HttpError
        Log.d(TAG, "HttpResponseException : " + e.getMessage());
        Log.d(TAG, "Status Code : " + e.getStatusCode());
        // TODO API returns 400 on successful HTTP payload, but invalid user data
        if(e.getStatusCode() == 400) {
                // Information on API error inside Response body
            }
   }
Run Code Online (Sandbox Code Playgroud)

java android httpclient

0
推荐指数
1
解决办法
4948
查看次数

android,如何将用户名和密码作为标题字段发送到webservice?

我正在尝试在Android手机上创建一个从用户获取用户名和密码的应用程序,使用md5加密密码,然后使用这些参数连接到url.

一个连接的代码在iphone上工作正常,但我在android中找不到类似的东西:

NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:myURL];

[request setHTTPMethod:@"GET"];

[request addValue:usernameField.text forHTTPHeaderField:@"UserName"];

[request addValue:MD5Pass2 forHTTPHeaderField:@"Password"];
Run Code Online (Sandbox Code Playgroud)

我试图通过httpurlconnection连接使用post/get Dataoutputstream,httpclient发送参数httpget/httppost,但没有成功.

我想我需要将参数作为headerfield发送,但我不知道如何.

注意:我比较了加密结果,这是正确的.

android httpclient httpurlconnection http-headers

0
推荐指数
1
解决办法
3781
查看次数

使用libev的异步HttpClient

我正在使用libebb(http://tinyclouds.org/libebb/)和libev编写一个Web服务器.我正在寻找一个使用libev事件循环的异步httpclient.

我希望它支持Http 1.1(流水线,保持活动等).

我希望这不是一个愚蠢的问题.

httpclient libevent libev

0
推荐指数
1
解决办法
2309
查看次数

如何将httpclient发布到WEB API?(我的高分榜的简单方法)

我的Windows Phone客户端发送一段代表名称和分数的JSON ......我应该使用Web API中的Class吗?将对象发送到服务器而不是原始json的代码是什么?

 private void btnCreateSampleScore_Click(object sender, RoutedEventArgs e)
    {
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("http://punkoutersoftware.azurewebsites.net");

            var content = new FormUrlEncodedContent(new[] 
                                                   {
                                                       new KeyValuePair<string, string>("Bob", "2.65")
                                                   });

            var result = client.PostAsync("/api/DrunkMeterScore", content).Result;

            string resultContent = result.Content.ReadAsStringAsync().Result;
            Console.WriteLine(resultContent);

            //DrunkMeterScore dms = new DrunkMeterScore();
            //dms.Name = "Bob";
            //dms.Score = 2.42;
        }

    }
Run Code Online (Sandbox Code Playgroud)

服务器正在使用纯Web API模板

 // POST api/DrunkMeterScore
    public HttpResponseMessage PostDrunkMeterScore(DrunkMeterScore drunkmeterscore)
    {
        if (ModelState.IsValid)
        {
            db.DrunkMeterScores.Add(drunkmeterscore);
            db.SaveChanges();

            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created, drunkmeterscore);
            response.Headers.Location = new Uri(Url.Link("DefaultApi", …
Run Code Online (Sandbox Code Playgroud)

post httpclient asp.net-web-api

0
推荐指数
1
解决办法
5522
查看次数

Eclipse中的HttpClient execute()崩溃

我们想在我们的服务器上运行一个php脚本,使用HttpClient和HttpPost将数据(在变量nameValuePairs中)插入到我们的数据库中.如果我们使用Idea IntelliJ创建以下代码作为Android应用程序,它可以正常工作.但是如果它是在Eclipse中创建的,则应用程序会在.execute()方法中崩溃,并抛出一个正常的异常"null".

HttpClient httpclient = new DefaultHttpClient(httpParameters);
HttpPost httppost = new HttpPost("http://bbpf.bplaced.net/insert.php");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
httpclient.execute(httppost);
Run Code Online (Sandbox Code Playgroud)

您是否熟悉该问题或为什么在Eclipse中创建的相同程序崩溃并在IntelliJ中运行?

编辑:这是Eclipse中的错误日志:

04-04 08:11:33.429: E/AndroidRuntime(2888): FATAL EXCEPTION: main
04-04 08:11:33.429: E/AndroidRuntime(2888): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mobile.inserttest/com.mobile.inserttest.MainActivity}: android.os.NetworkOnMainThreadException
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1967)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.os.Looper.loop(Looper.java:137)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at android.app.ActivityThread.main(ActivityThread.java:4441)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at java.lang.reflect.Method.invokeNative(Native Method)
04-04 08:11:33.429: E/AndroidRuntime(2888):     at java.lang.reflect.Method.invoke(Method.java:511)
04-04 …
Run Code Online (Sandbox Code Playgroud)

eclipse android httpclient intellij-idea

0
推荐指数
1
解决办法
2984
查看次数

多个httpclient post调用进入foreach循环angular 5

我需要使用httpclient进入foreach循环。有可能的?正确的方法是什么?这是我的代码:

this.attachToDelete.forEach( 
          element => {
            this.documentService.DeleteAttachment(element, this.newDocumentId.toString());
            console.log("upload delete from submit", element);
          }
        );
Run Code Online (Sandbox Code Playgroud)

这是对应服务中的方法:

public DeleteAttachment(attachmentId: number, documentId: string) {    
    let headers = new HttpHeaders();
    headers = headers.set('Content-Type', 'application/json; charset=utf-8');
    return this.http.post('http://localhost:8080/DocumentAPI/api/document/RemoveAttachment?docId=' + documentId + '&attachmentId='+attachmentId, attachmentId,  { headers: headers }).subscribe(
      data => { 
        if(data)
        console.log("delete attach????", data);
        else{
          console.log('Error occured');
        } 
      }     
    );
  }
Run Code Online (Sandbox Code Playgroud)

post call httpclient rxjs angular

0
推荐指数
1
解决办法
2817
查看次数